//from https://github.com/cocodataset/cocoapi/blob/master/common/maskApi.h
/**************************************************************************
* Microsoft COCO Toolbox.      version 2.0
* Data, paper, and tutorials available at:  http://mscoco.org/
* Code written by Piotr Dollar and Tsung-Yi Lin, 2015.
* Licensed under the Simplified BSD License [see coco/license.txt]
**************************************************************************/
#pragma once
#include <string>

namespace coco {

using uint = unsigned int;
using siz = unsigned long;
using byte = unsigned char;
using BB = double*;

struct RLE {
	siz h, w, m;
	uint* cnts;
};

/* Initialize/destroy RLE. */
void rleInit(RLE* R, siz h, siz w, siz m, uint* cnts);
void rleFree(RLE* R);

/* Initialize/destroy RLE array. */
void rlesInit(RLE** R, siz n);
void rlesFree(RLE** R, siz n);

/* Encode binary masks using RLE. */
void rleEncode(RLE* R, const byte* mask, siz h, siz w, siz n);

/* Decode binary masks encoded via RLE. */
void rleDecode(const RLE* R, byte* mask, siz n);

/* Compute union or intersection of encoded masks. */
void rleMerge(const RLE* R, RLE* M, siz n, int intersect);

/* Compute area of encoded masks. */
void rleArea(const RLE* R, siz n, uint* a);

/* Compute intersection over union between masks. */
void rleIou(RLE* dt, RLE* gt, siz m, siz n, byte* iscrowd, double* o);

/* Compute non-maximum suppression between bounding masks */
void rleNms(RLE* dt, siz n, uint* keep, double thr);

/* Compute intersection over union between bounding boxes. */
void bbIou(BB dt, BB gt, siz m, siz n, byte* iscrowd, double* o);

/* Compute non-maximum suppression between bounding boxes */
void bbNms(BB dt, siz n, uint* keep, double thr);

/* Get bounding boxes surrounding encoded masks. */
void rleToBbox(const RLE* R, BB bb, siz n);

/* Convert bounding boxes to encoded masks. */
void rleFrBbox(RLE* R, const BB bb, siz h, siz w, siz n);

/* Convert polygon to encoded mask. */
void rleFrPoly(RLE* R, const double* xy, siz k, siz h, siz w);

/* Get compressed string representation of encoded mask. */
char* rleToString(const RLE* R);

/* Convert from compressed string representation of encoded mask. */
void rleFrString(RLE* R, char* s, siz h, siz w);
}